iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
自我挑戰組

模仿知名網站的外觀系列 第 7

【Day7】模仿知名網站的外觀 Instagram(7) 編寫Instagram首頁-2與Chakra UI

  • 分享至 

  • xImage
  •  

我們繼續完成post區塊。

首先做出一個post的雛形,post內有圖片,有喜歡、留言、分享、儲存按鈕,滑鼠放在這些按鈕上會變得有點透明,另外,喜歡跟留言按鈕按下去顏色會有變化。顯示喜歡和留言數,最底下可以留言。

根據這些要求修改PostCard.jsx。

import React, { useState } from "react";
import {
	BsBookmark,
	BsBookmarkFill,
	BsThreeDots,
	BsEmojiSmile,
} from "react-icons/bs";
import { AiFillHeart, AiOutlineHeart } from "react-icons/ai";
import { FaRegComment } from "react-icons/fa";
import { IoPaperPlaneOutline } from "react-icons/io5";
import "./PostCard.css";

const PostCard = () => {
	const [showDropDown, setShowDropDown] = useState(false);
	const [isPostLiked, setIsPostLiked] = useState(false);
	const [isPostSaved, setIsPostSaved] = useState(false);

	const handlePostSave = () => {
		setIsPostSaved(!isPostSaved);
	};

	const handlePostLike = () => {
		setIsPostLiked(!isPostLiked);
	};

	const handleClick = () => {
		setShowDropDown(!showDropDown);
	};

	return (
		<div>
			<div className="border rounded-md w-full">
				<div className="flex justify-between items-center w-full py-4 px-5">
					<div className="flex items-center">
						<img
							className="h-12 w-12 rounded-full"
							src="https://images.pexels.com/photos/18048873/pexels-photo-18048873/free-photo-of-4k.jpeg?auto=compress"
							alt=""
						/>
						<div className="pl-2">
							<p className="font-semibold text-sm">username</p>
							<p className="font-thin text-sm">location</p>
						</div>
					</div>
					<div className="dropdown">
						<BsThreeDots className="dots" onClick={() => handleClick()} />
						{showDropDown && (
							<p className="bg-black text-white py-1 px-4 rounded-md cursor-pointer">
								Report
							</p>
						)}
					</div>
				</div>

				<div className="w-full">
					<img className="w-full" src="https://images.pexels.com/photos/18111496/pexels-photo-18111496.jpeg?auto=compress&cs=tinysrgb&w=468&h=585" alt="" />
				</div>

				<div className="flex justify-between items-center w-full px-5 py-4">
					<div className="flex items-center space-x-2">
						{isPostLiked ? (
							<AiFillHeart
								className="text-2xl hover:opacity-50 cursor-pointer text-red-600"
								onClick={() => handlePostLike()}
							/>
						) : (
							<AiOutlineHeart
								className="text-2xl hover:opacity-50 cursor-pointer"
								onClick={() => handlePostLike()}
							/>
						)}

						<FaRegComment className="text-xl hover:opacity-50 cursor-pointer" />
						<IoPaperPlaneOutline className="text-xl hover:opacity-50 cursor-pointer" />
					</div>

					<div className="cursor-pointer">
						{isPostSaved ? (
							<BsBookmarkFill
								onClick={() => handlePostSave()}
								className="text-xl hover:opacity-50 cursor-pointer"
							/>
						) : (
							<BsBookmark
								onClick={() => handlePostSave()}
								className="text-xl hover:opacity-50 cursor-pointer"
							/>
						)}
					</div>
				</div>

				<div className="w-full py-2 px-5">
					<p>11 likes</p>
					<p className="opacity-50 py-2 cursor-pointer">view all 45 comments</p>
				</div>

				<div className="w-full">
					<div className="flex w-full items-center px-5">
						<input
							className="commentInput"
							type="text"
							placeholder="Add a comment..."
						/>
						<BsEmojiSmile />
					</div>
				</div>
			</div>
		</div>
	);
};

export default PostCard;

雖然大小和細節的地方有點不同,但大致上還是與Instagram有相似之處,按下愛心和書籤的按鈕會變色。

Untitled

來到PostCard.css,添加commentInput的css設定,調整成真實Instagram的模樣。

.commentInput {
    border: none;
    outline: none;
    width: 100%;
    padding: .5rem .7rem;
}

修改後的結果如下:

Untitled

接下來我們要處理按下Comment按鈕時,顯示的Comment視窗。

在Components資料夾下,新增Comment資料夾。

在Comment資料夾下,新增CommentModal.jsx,用來處理Comment視窗顯示的部分。

我們會使用Chakra UI加速開發,它提供了一些方便使用元件,我們就不需要從零開始寫程式碼了,只需要把Chakra UI提供的設計依自己的需求修改即可。

按照指示https://chakra-ui.com/getting-started ,安裝chakra-ui。

在終端機輸入:

npm i @chakra-ui/react @emotion/react @emotion/styled framer-motion

等到完成後,修改main.jsx導入Chakra,在開頭部分

import { ChakraProvider } from "@chakra-ui/react";

ChakraProvider包圍

<ChakraProvider>
	<App />
</ChakraProvider>

現在可以在React專案中使用Chakra UI了。

前往這個網頁https://chakra-ui.com/docs/components/modal/usage#make-modal-vertically-centered ,找到第一行是

function VerticallyCenter() {

的區塊把Modal的部分複製起來,我們接下來會以此程式碼為基礎做修改。

<Modal onClose={onClose} isOpen={isOpen} isCentered>
  <ModalOverlay />
  <ModalContent>
    <ModalHeader>Modal Title</ModalHeader>
    <ModalCloseButton />
    <ModalBody>
      <Lorem count={2} />
    </ModalBody>
    <ModalFooter>
      <Button onClick={onClose}>Close</Button>
    </ModalFooter>
  </ModalContent>
</Modal>

回到CommentModal.jsx,將程式碼複製貼上然後做一些修改。

import { Modal, ModalBody, ModalCloseButton, ModalContent, ModalHeader, ModalOverlay } from "@chakra-ui/react";
import React from "react";

const CommentModal = ({onClose, isOpen}) => {
	return (
		<div>
			<Modal onClose={onClose} isOpen={true} isCentered>
				<ModalOverlay />
				<ModalContent>
					<ModalHeader>Modal Title</ModalHeader>
					<ModalCloseButton />
					<ModalBody>
						
					</ModalBody>
					
				</ModalContent>
			</Modal>
		</div>
	);
};

export default CommentModal;

在PostCard.jsx的開頭

import CommentModal from "../Comment/CommentModal";

在最外面的div添加CommentModal。

			<CommentModal />
		</div>
	);
};

export default PostCard;

啟動專案看到這個關不掉的視窗,就代表成功了。

Untitled


上一篇
【Day6】模仿知名網站的外觀 Instagram(6) 編寫Instagram首頁
下一篇
【Day8】模仿知名網站的外觀 Instagram(8) 編寫Comment區塊
系列文
模仿知名網站的外觀30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言